#include <regex>
#include "command-func.hpp"
#include "util.hpp"

CommandFunc::CommandFunc()
{
}

CommandFunc::~CommandFunc()
{
}

bool CommandFunc::DelFunc(std::string func_name)
{
    return m_func.erase(func_name) == 1;
}

bool CommandFunc::AddFunc(std::string func_name, std::function<std::string(std::string)> func)
{
    static std::regex pat("\\w*");
    if (!std::regex_match(func_name, pat))
        return false;
    func_name = to_lower(func_name);
    if (m_func.find(func_name) != m_func.end())
        return false;
    m_func.emplace(func_name, func);
    return true;
}

std::function<std::string(std::string)> &CommandFunc::operator[](std::string func_name)
{
    return m_func[func_name];
}
std::string CommandFunc::ParaseAndCall(std::string cmd)
{
    static std::regex pat("\\s*(\\w*)\\s*(.*)");
    std::smatch result;
    if (std::regex_match(cmd, result, pat))
    {
        auto func_name = result.str(1);
        func_name = to_lower(func_name);
        if (m_func.find(func_name) != m_func.end())
            return m_func[func_name](result.str(2));
    }
    return std::string();
}